package com.hxk.stream;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * 异步回调框架CompletableFuture
 *      有两种：
 *          1、没有返回值的
 *          2、有返回值的
 */
public class CompletableFutureCase {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /**
         * 没有返回值的
         */
        CompletableFuture<Void> completableFuture = CompletableFuture.runAsync(()->{
            System.out.println(Thread.currentThread().getName()+"\t 没有返回值");
        });
        completableFuture.get();//调用任务

        /***
         * 有返回值的调用，
         * 这个方法原理很像ajax的方法
         * whenComplete 为ajax中的success方法
         * exceptionally 为ajax中的error方法
         */
        CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.supplyAsync(() -> {//异步调用
            System.out.println(Thread.currentThread().getName()+"\t 有返回值");
            int i = 10/0;//模拟异常
            return 1024;
        }).whenComplete((t,u)->{//正常和异常情况下都要被执行的方法
            System.out.println("--------->t:"+t);//正常时，t为上面的1024，异常时，t为null
            System.out.println("--------->u:"+u);//正常时，u为null，异常时，u为异常信息
        }).exceptionally(e -> {//当有异常时兜底的方法
            System.out.println(e.getMessage());
            return 444;
        });

        System.out.println(integerCompletableFuture.get());//调用任务
    }
}
